package com.liuhung.base.service;

import java.util.Date;
import java.util.List;
import java.util.UUID;

import org.springframework.transaction.annotation.Transactional;

import com.liuhung.base.dao.RootDao;
import com.liuhung.base.entity.BaseEntity;
import com.liuhung.base.page.BasePage;
import com.liuhung.base.util.ClassReflectUtil;
@Transactional
public abstract class BaseService<T extends BaseEntity> {
	public abstract RootDao<T> getDao();

	public void add(T  t) throws Exception {
		// 设置主键.字符类型采用UUID,数字类型采用自增
		String uuid = UUID.randomUUID().toString();
		uuid= uuid.replaceAll("-", "");
		ClassReflectUtil.setIdKeyValue(t, "id", uuid);
		t.setDatecreated(new Date());
		t.setStatus(1);
		t.setDeleted(0);
		getDao().add(t);
	}

	public void update(T t) throws Exception {
		t.setLastupdated(new Date());
		getDao().update(t);
	}

	public void updateBySelective(T t) {
		t.setLastupdated(new Date());
		getDao().updateBySelective(t);
	}

	public void remove(Object[] ids) throws Exception {
		if (ids == null || ids.length < 1) {
			return;
		}
		for (Object id : ids) {
			getDao().delete(id);
		}
	}

	public void remove(Object id) throws Exception {
		getDao().delete(id);
	}
	
	public void delete(Object[] ids) throws Exception {
		if (ids == null || ids.length < 1) {
			return;
		}
		for (Object id : ids) {
			delete(id);
		}
	}
	public void delete(Object id) throws Exception {
		T t=getDao().queryById(id);
		t.setDeleted(1);
		getDao().update(t);
	}

	public int queryByCount(BasePage page) throws Exception {
		page.setDeleted(0);
		page.setStatus(0);
		return getDao().queryByCount(page);
	}
	/*****************************************
	 * @Description 
	 * @param page 查询实体
	 * @return 查询到的实体列表
	 * @throws Exception   
	 * @author liuhung
	 ****************************************/
	public List<T> queryByList(BasePage page) throws Exception {
		page.setDeleted(0);
		page.setStatus(0);
		return  (List<T>) getDao().queryByList(page);
	}
	/*****************************************
	 * @Description
	 * @param page 查询实体
	 * @param deleted 是否为删除掉的 0未为标记为删除的 1为删除的
	 * @return 查询到的实体数目
	 * @throws Exception   
	 * @author liuhung
	 ****************************************/
	public int queryByCount(BasePage page,int deleted) throws Exception {
		page.setDeleted(deleted);
		return getDao().queryByCount(page);
	}
	/*****************************************
	 * @Description
	 * @param page 查询实体
	 * @param deleted 是否为删除掉的  0未为标记为删除的 1为删除的
	 * @return 查询到的实体列表
	 * @throws Exception   
	 * @author liuhung
	 ****************************************/
	public List<T> queryByList(BasePage page,int deleted) throws Exception {
		page.setDeleted(0);
		return getDao().queryByList(page);
	}
	/*****************************************
	 * @Description
	 * @param page 查询实体
	 * @param deleted 是否为删除掉的  0未为标记为删除的 1为删除的
	 * @param status 实体状态  是否禁用等  1为正常  0 为禁用   2为锁定  
	 * @return 查询到的实体数目
	 * @throws Exception   
	 * @author liuhung
	 ****************************************/
	public int queryByCount(BasePage page,int deleted,int status) throws Exception {
		page.setDeleted(deleted);
		page.setStatus(status);
		return getDao().queryByCount(page);
	}
	/*****************************************
	 * @Description
	 * @param page 查询实体
	 * @param deleted 是否为删除掉的  0未为标记为删除的 1为删除的
	 * @param status 实体状态  是否禁用等  1为正常  0 为禁用   2为锁定  
	 * @return 查询到的实体列表
	 * @throws Exception   
	 * @author liuhung
	 ****************************************/
	public List<T> queryByList(BasePage page,int deleted,int status) throws Exception {
		page.setDeleted(0);
		page.setStatus(status);
		return getDao().queryByList(page);
	}
	public T queryById(Object id) throws Exception {
		
		return getDao().queryById(id);
	}
}
